//
//  BinaryTree.h
//  Objc进阶Demo
//
//  Created by Don't update on 2018/8/20.
//  Copyright © 2018年 Don't update. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface BinaryTree : NSObject
@property (nonatomic,strong)BinaryTree *rightNode; //右节点
@property (nonatomic,strong)BinaryTree *leftNode;  //左节点
@property (nonatomic,assign)NSInteger Value;

+(BinaryTree *)createTreeWithValues:(NSArray *)arr;
+(BinaryTree *)addTreeNode:(BinaryTree *)treeNode WithValue:(NSInteger)value;

/**
 * 二叉树中某个位置的节点 按层次遍历,从指定的层开始遍历
 *
 *  @param index 按层次遍历树是的位置(从0开始)
 *  @param rootNode  树根节点
 */
+(BinaryTree *)treeNodeAtIndex:(NSInteger)index inTree:(BinaryTree *)rootNode;


/**
 * 先序遍历
 * 先访问根,再遍历左子树,再遍历右子树
 *
 * @param rootNode 根节点
 * @param handler 访问节点处理函数
 */
+(void)perOrderTraverseTree:(BinaryTree *)rootNode handler:(void(^)(BinaryTree *treeNode))handler;



/**
 * 中序遍历
 * 先遍历左子树,再访问根,再访问右子树
 *
 * @param rootNode 根节点
 * @param handler 访问节点处理函数
 */
+(void)inOrderTraverseTree:(BinaryTree *)rootNode handler:(void(^)(BinaryTree *treeNode)) handler;

/**
 * 后序遍历
 */
+(void)postOrderTraverseTree:(BinaryTree *)rootNode handler:(void(^)(BinaryTree * treeNode))handler;


/**
 * 层次遍历(广度优先算法)
 * 按照从上到下、从左到右的次序进行遍历。先遍历完一层，再遍历下一层
 * 又叫广度优先遍历。需要用到队列，在OC里可以用可变数组来实现。
 */
+(void)leveTraverseTree:(BinaryTree *)rootNode handler:(void(^) (BinaryTree *treeNodel))handler;

/**
 * 二叉树深度
 * @param rootNode 二叉树节点
 * @return 二叉树深度
 */
+(NSInteger)depthOfTree:(BinaryTree *)rootNode;


/**
 * 二叉树宽度
 * @param rootNode 二叉树根节点
 * @return 二叉树宽度
 */
+(NSInteger)widthOfTree:(BinaryTree *)rootNode;


/**
 * 二叉树所有的节点数
 * @return 所以节点数
 */
+(NSInteger)numberOfNodexInTree:(BinaryTree *)rootNode;
@end
